// #pragma once

// #include <iostream>
// #include <string>
// #include <cstdarg>
// #include <ctime>
// #include <unistd.h>

// using namespace std;

// #define DEBUG 0   // 表示调试
// #define NORMAL 1  // 表示正常
// #define WORNING 2 // 表示警告
// #define ERROR 3   // 表示错误，但是不影响我后续代码继续运行，只是报错
// #define FATAL 4   // 致命错误

// const char* levelstr(int level)
// {
//     switch(level)
//     {
//         case DEBUG: return "DEBUG";
//         case NORMAL: return "NORMAL";
//         case WORNING: return "WORNING";
//         case ERROR: return "ERROR";
//         case FATAL: return "FATAL";
//         default:return nullptr;
//     }
// }

// // 可变参数列表，加上..就可以在调用logMessage的地方进行打印数据
// void logMessage(int level, const char *format, ...)
// {
//     // 日志格式————[日志等级][时间/时间戳][pid][message]
//     // 可变参数列表需要：
//     //1、va_list自动向后移动;2、va_arg()一次向后面移动多少个字节;3、va_start()指向打印信息的开始;4、va_end()指向空;
// #define Num 1024
//     char logprefix[Num];
//     snprintf(logprefix, sizeof(logprefix), "[%s][%ld][pid:%d]",levelstr(level),(long int)time(nullptr),getpid());

//     char logcontent[Num];//这里是可变的
//     va_list arg;
//     va_start(arg, format);
//     vsnprintf(logcontent, sizeof(logcontent), format, arg);
//     cout << logprefix << logcontent << endl;

// }

#pragma once

#include <iostream>
#include <string>
#include <cstdarg>
#include <ctime>
#include <unistd.h>

using namespace std;

#define DEBUG 0   // 表示调试
#define NORMAL 1  // 表示正常
#define WORNING 2 // 表示警告
#define ERROR 3   // 表示错误，但是不影响我后续代码继续运行，只是报错
#define FATAL 4   // 致命错误

const char *levelstr(int level)
{
    switch (level)
    {
    case DEBUG:
        return "DEBUG";
    case NORMAL:
        return "NORMAL";
    case WORNING:
        return "WORNING";
    case ERROR:
        return "ERROR";
    case FATAL:
        return "FATAL";
    default:
        return nullptr;
    }
}

void logMessage(int level, const char *format, ...)
{
#define Num 1024
    char logprefix[Num];
    snprintf(logprefix, sizeof(logprefix), "[%s][%ld][pid:%d]", levelstr(level), (long int)time(nullptr), getpid());

    char logcontent[Num];
    va_list arg;
    va_start(arg, format);
    vsnprintf(logcontent, sizeof(logcontent), format, arg);
    cout << logprefix << logcontent << endl;
}
